﻿using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Text;
using Antlr.Runtime;
using Antlr.Runtime.Tree;

namespace Kaleida.ServiceMonitor.Model.Parsing
{
    public static class SyntaxTreeExtensions
    {
        public static string Describe(this ITree node)
        {
            return Describe(node, 0);
        }

        public static IList<ITree> GetChildren(this ITree node)
        {
            var children = new List<ITree>();
            for (int i = 0; i < node.ChildCount; i++)
            {
                children.Add(node.GetChild(i));
            }
            return children;
        }

        private static string Describe(ITree node, int depth)
        {
            if (node == null) return "";

            var treeString = new StringBuilder();
            treeString.AppendLine((new string(' ', depth * 2) + node.Text).PadRight(30));

            for (int i = 0; i < node.ChildCount; i++)
            {
                treeString.Append(Describe(node.GetChild(i), depth + 1));
            }

            return treeString.ToString();
        }
    }

    public static class ParserExtensions
    {
        public static CommonTree GetSyntaxTree(this string scriptSource)
        {
            var input = new ANTLRStringStream(scriptSource);
            var lexer = new ScriptGrammarLexer(input);
            var tokens = new CommonTokenStream(lexer);
            var parser = new ScriptGrammarParser(tokens);

            ScriptGrammarParser.file_return file = parser.file();

            if(parser.NumberOfSyntaxErrors > 0)
                throw new InvalidOperationException("Script contains syntax errors");

            return (CommonTree) file.Tree;
        }

    }
}
